/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ControladoresUI;

import AdmonHorarios.AdminCalendario;
import AdmonHorarios.Aula;
import AdmonHorarios.Calendario;
import AdmonHorarios.Catedratico;
import AdmonHorarios.Curso;
import AdmonHorarios.Hora;
import AdmonHorarios.Periodo;
import AdmonHorarios.Propuesta;
import AdmonHorarios.Seccion;
import Entidades.Usuario;
import ManagersUI.AsignacionCursoAulaManager;
import ManagersUI.DisponibilidadCatedraticoManager;
import Usuarios.conexion;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.AnchorPane;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

/**
 * FXML Controller class
 *
 * @author Chejo
 */
public class AsignacionCursoAulaController implements Initializable {

    //Conexion para la Base de Datos
    EntityManagerFactory emf = conexion.getInstancia().getEMF();
    EntityManager em = emf.createEntityManager();
    AsignacionCursoAulaManager asignacionCursoAulaManager;
    Curso curso;
    Seccion seccion;
    String anio,semestre;
    @FXML ComboBox cmbEdificio, cmbPeriodo, cmbDia;
    @FXML ListView lstCatedratico, lstAula;
    @FXML TextField txtCurso, txtSeccion, txtCredito;
    @FXML TableView tblHorario;
    @FXML Button btnSiguiente, btnFinalizar, btnAsignar;
    @FXML Label lblCreditosT, lblCreditosP, lblCredito;
    private AdminCalendario datos = new AdminCalendario();
    Calendario calendario;
    public ArrayList <Curso> Cursos = new ArrayList <Curso> ();
    public ArrayList <Catedratico> Catedraticos = new ArrayList <Catedratico> ();
    public ArrayList <Aula> Aulas = new ArrayList <Aula> ();
    public ArrayList <Hora> horas = new ArrayList <Hora> ();
    public int CreditosP, CreditosT;
    @FXML
    private AnchorPane pnlFunciones;
    @FXML
    private Label lblTituloPnl;
    
    public void initManager(final AsignacionCursoAulaManager asignacionCursoAulaManager, Curso curso, 
    Seccion seccion, 
    String anio, 
    String semestre,
    ArrayList <Curso> Cursos,
    ArrayList <Catedratico> Catedraticos,
    ArrayList <Aula> Aulas,
    ArrayList <Hora> horas,
    Calendario calendario,
    int CreditosP, 
    int CreditosT){
        this.asignacionCursoAulaManager = asignacionCursoAulaManager;
        this.curso=curso;
        this.seccion=seccion;
        this.anio=anio;
        this.semestre=semestre;
        this.calendario=calendario;
        this.Aulas=Aulas;
        this.Catedraticos=Catedraticos;
        this.Cursos=Cursos;
        this.horas=horas;
        this.CreditosT=CreditosT;
        this.CreditosP=CreditosP;
        btnSiguiente.setDisable(true);
        cmbEdificio.setItems(datos.obtenerEdificios());
        ObservableList<String> dias=FXCollections.observableArrayList("Lunes","Martes","Miércoles","Jueves","Viernes","Sábado");
        cmbDia.setItems(dias);
        lstCatedratico.setItems(datos.obtenerCatedraticosPorCurso(curso));
        txtCurso.setText(curso.getNombre());
        txtSeccion.setText(seccion.getNumero());
        txtCurso.setEditable(false);
        txtSeccion.setEditable(false);
        lblCreditosT.setText(curso.getCreditosTeoricos()+" créditos teóricos");
        lblCreditosP.setText(curso.getCreditosPracticos()+" créditos practicos");
        cmbPeriodo.setItems(datos.obtenerPeriodos(anio, semestre));
        if (CreditosT >= 1){
            txtCredito.setText("1");
            lblCredito.setText("Crédito Teórico");
        }else{
            txtCredito.setText("1");
            lblCredito.setText("Crédito Practico");
        }
        btnFinalizar.setVisible(false);
        llenarCalendario();
    }
    
    //////////////////////////Funciones/////////////////////////////////////////
    
    public boolean verificarDisponibilidad (Catedratico catedratico, boolean rcatedratico,
            Aula aula, boolean raula, int posDia, int posPeriodo, String Dia){
        boolean disponible = false;
        if (rcatedratico==true){
            int dia=posDia;
            String D="";
            if (dia==0){
                D="Lunes";
            }
            if (dia==1){
                D="Martes";
            }
            if (dia==2){
                D="Miércoles";
            }
            if (dia==3){
                D="Jueves";
            }
            if (dia==4){
                D="Viernes";
            }
            if (dia==5){
                D="Sábado";
            }
            int idC=catedratico.getIdCatedratico();
            Query qr = em.createQuery("Select hc.idHorarioCatedratico from Horariocatedratico hc "
                    + "where hc.catedraticoidCatedratico.numeroCatedratico = "+idC+" and hc.dia = '"+D
                    + "' and hc.anulado = false");
            List<Integer> idHC = qr.getResultList();
            qr = em.createQuery("Select apc from Asignacionperiodocatedratico apc "
                    + "where apc.periodoidPeriodo.idPeriodo = "+horas.get(posPeriodo).getNumPeriodo()
                    + " and apc.horarioCatedraticoidHorarioCatedratico.idHorarioCatedratico = "+idHC.get(0));
            List<Entidades.Asignacionperiodocatedratico> disp = qr.getResultList();
            if (disp.size()>0){
                disponible = disp.get(0).getDisponible();
                if (disponible==false){
                    JOptionPane.showMessageDialog(null, "El catedratico "+
                        catedratico.getNombres()+" "+
                        catedratico.getApellidos()+" no esta disponible "
                        + "en el periodo de "+horas.get(posPeriodo).getHoraInicio()
                        + " hrs. a "+horas.get(posPeriodo).getHoraFin()
                        + " hrs. el dia "+Dia);
                    asignacionCursoAulaManager.abrirPanelDisponibilidad(idC, horas, false);
                    /*InterfazTraslape frm = new InterfazTraslape(catedratico.getNombres()+" "+
                        catedratico.getApellidos());
                    frm.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                    frm.setVisible(true);
                    frm.setDatos(idC, horas, false);*/
                }
            }else{
                JOptionPane.showMessageDialog(null, "El catedratico "+
                        catedratico.getNombres()+" "+
                        catedratico.getApellidos()+" no tiene informacion de disponibilidad "
                        + "en el periodo de "+horas.get(posPeriodo).getHoraInicio()
                        + " hrs. a "+horas.get(posPeriodo).getHoraFin()
                        + " hrs. el dia "+Dia);
                //asignacionCursoAulaManager.abrirPanelDisponibilidad(idC, horas, false);
                /*InterfazTraslape frm = new InterfazTraslape(catedratico.getNombres()+" "+
                        catedratico.getApellidos());
                frm.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                frm.setVisible(true);
                frm.setDatos(idC, horas, false);*/
            }
        }
        if (raula==true){
            int dia = posDia;
            int idA = aula.getIdAula();
            String D="";
            if (dia==0){
                D="Lunes";
            }
            if (dia==1){
                D="Martes";
            }
            if (dia==2){
                D="Miércoles";
            }
            if (dia==3){
                D="Jueves";
            }
            if (dia==4){
                D="Viernes";
            }
            if (dia==5){
                D="Sábado";
            }
            Query qr = em.createQuery("Select ha.idHorarioAula from Horarioaula ha "
                    + "where ha.aulaidAula.idAula = "+idA+" and ha.dia = '"+D
                    + "' and ha.anulado = false");
            List<Integer> idHA = qr.getResultList();
            qr = em.createQuery("Select apa from Asignacionperiodoaula apa "
                    + "where apa.periodoidPeriodo.idPeriodo = "+horas.get(posPeriodo).getNumPeriodo()
                    + " and apa.horarioAulaidHorarioAula.idHorarioAula = "+idHA.get(0));
            List<Entidades.Asignacionperiodoaula> disp = qr.getResultList();
            if (disp.size()>0){
                disponible = disp.get(0).getDisponible();
                if (disponible==false){
                    JOptionPane.showMessageDialog(null, "Aula "+
                        aula.getNombre()+" no esta disponible "
                        + "en el periodo de: "+horas.get(posPeriodo).getHoraInicio()
                        + " hrs. a "+horas.get(posPeriodo).getHoraFin() + " hrs."
                        + " el dia "+Dia);
                    //asignacionCursoAulaManager.abrirPanelDisponibilidad(idA, horas, true);
                    /*InterfazTraslape frm = new InterfazTraslape(aula.getNombre());
                    frm.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                    frm.setVisible(true);
                    frm.setDatos(idA, horas, true);*/
                }
            }else{
                JOptionPane.showMessageDialog(null, "Aula "+
                        aula.getNombre()+" no tiene informacion de disponibilidad "
                        + "en el periodo de: "+horas.get(posPeriodo).getHoraInicio()
                        + " hrs. a "+horas.get(posPeriodo).getHoraFin() + " hrs."
                        + " el dia "+Dia);
                //asignacionCursoAulaManager.abrirPanelDisponibilidad(idA, horas, true);
                /*InterfazTraslape frm = new InterfazTraslape(aula.getNombre());
                frm.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                frm.setVisible(true);
                frm.setDatos(idA, horas, true);*/
            }
        }
        
        return disponible;
    }
    
    public boolean asignarPropuestaPeriodo(Propuesta propuesta, Periodo periodo,
            int posDia, int posPeriodo, String Dia){
        boolean asignar=true;
        if (propuesta.getCatedratico()!=null){
            if (verificarDisponibilidad(propuesta.getCatedratico(),true,null,false,
                    posDia,posPeriodo,Dia) == false){
                asignar = false;
            }
        }
        if (verificarDisponibilidad(null,false,propuesta.getAula(),true,
                posDia,posPeriodo,Dia) == false){
            asignar = false;
        }
        if (propuesta.getSeccion().getCupo()>propuesta.getAula().getCapacidad()){
            asignar = false;
        }
        if (asignar){
            periodo.setPropuesta(propuesta);
        }
        return asignar;
    }
    
    public void guardarCalendario(){
        //Para cada fila del calendario
        for (int fila=0; fila<horas.size(); fila++){
            //Para cada columna (dia)
            for (int dia=0; dia<6; dia++){
                int prop=calendario.getEnlace(fila).getPeriodo(dia).getPropuestas().size();
                //Para todas las propuestas de cada columna (dia) ... si existen
                for (int i=0; i<prop; i++){
                    Propuesta p = calendario.getEnlace(fila).getPeriodo(dia).getPropuesta(i);
                    int idSec = p.getSeccion().getIdS();
                    String D="";
                    if (dia==0){
                        D="Lunes";
                    }
                    if (dia==1){
                        D="Martes";
                    }
                    if (dia==2){
                        D="Miércoles";
                    }
                    if (dia==3){
                        D="Jueves";
                    }
                    if (dia==4){
                        D="Viernes";
                    }
                    if (dia==5){
                        D="Sábado";
                    }
                    Query qr = em.createQuery("select hc from Horariocurso hc "
                            + "where hc.asignacionSeccionCursoidAsignacionSeccionCurso.idAsignacionSeccionCurso="+idSec
                            + " and hc.aulaidAula.idAula="+p.getAula().getIdAula()
                            + " and hc.dia='"+D+"' and hc.anulado=false");
                    List<Entidades.Horariocurso> HorC =qr.getResultList();
                    if (HorC.size()<=0){ //Si no esta guardada
                        System.out.println("Lo guardo en el periodo:"+fila+" el dia:"+D);
                        //Ingresar nuevo HorarioAula
                        Controladores.HorariocursoJpaController tablaHorarioCurso = new Controladores.HorariocursoJpaController(emf);
                        Entidades.Horariocurso hc = new Entidades.Horariocurso();
                        hc.setAnulado(false);
                        qr = em.createQuery("select asc1 from Asignacionseccioncurso asc1 "
                                + "where asc1.idAsignacionSeccionCurso="+idSec);
                        List<Entidades.Asignacionseccioncurso> ASC =qr.getResultList();
                        hc.setAsignacionSeccionCursoidAsignacionSeccionCurso(ASC.get(0));
                        qr = em.createQuery("select a from Aula a "
                                + "where a.idAula="+p.getAula().getIdAula());
                        List<Entidades.Aula> Aula =qr.getResultList();
                        hc.setAulaidAula(Aula.get(0));
                        hc.setDia(D);
                        //Semestre
                        qr = em.createQuery("Select s from Semestre s "
                            + "where s.año='"+anio+"-01-01"
                            + "' and s.semestre="+semestre
                            + " and s.anulado=false");
                        List<Entidades.Semestre> Semestre =qr.getResultList();
                        hc.setSemestreidSemestre(Semestre.get(0));
                        tablaHorarioCurso.create(hc);
                        //Ingresar nueva AsignacionPeriodoCurso
                        Controladores.AsignacionperiodocursoJpaController tablaAPC = new Controladores.AsignacionperiodocursoJpaController(emf);
                        Entidades.Asignacionperiodocurso APC = new Entidades.Asignacionperiodocurso();
                        APC.setHorarioCursoidHorarioCurso(hc);
                        qr = em.createQuery("SELECT p from Periodo p "
                                + "where p.idPeriodo = "+horas.get(fila).getNumPeriodo());
                        List<Entidades.Periodo> Periodo =qr.getResultList();
                        APC.setPeriodoidPeriodo(Periodo.get(0));
                        tablaAPC.create(APC);
                        //Ya se habra ingresado la propuesta correcta y verificada
                        //Asignar catedratico a seccion y modificar disponibilidad
                        if (p.getCatedratico()!=null){
                            em.getTransaction().begin();
                            int idC = p.getCatedratico().getIdCatedratico();
                            qr = em.createQuery("SELECT c from Catedratico c "
                                + "where c.numeroCatedratico = "+idC+" and c.anulado = false");
                            List<Entidades.Catedratico> Cated =qr.getResultList();
                            Entidades.Asignacionseccioncurso secc = em.find(Entidades.Asignacionseccioncurso.class, ASC.get(0).getIdAsignacionSeccionCurso());
                            secc.setCatedraticoidCatedratico(Cated.get(0));
                            em.merge(secc);
                            em.getTransaction().commit();
                            //Modificar disponibilidad catedratico
                            qr = em.createQuery("SELECT hc FROM Horariocatedratico hc "
                                    + "where hc.catedraticoidCatedratico.numeroCatedratico="+idC
                                    + " and hc.dia='"+D+"' and hc.anulado=false");
                            List<Entidades.Horariocatedratico> HorCat =qr.getResultList();
                            qr = em.createQuery("SELECT apc from Asignacionperiodocatedratico apc "
                                    + "where apc.horarioCatedraticoidHorarioCatedratico.idHorarioCatedratico="+HorCat.get(0).getIdHorarioCatedratico()
                                    + " and apc.periodoidPeriodo.idPeriodo="+horas.get(fila).getNumPeriodo());
                            List<Entidades.Asignacionperiodocatedratico> APCat =qr.getResultList();
                            em.getTransaction().begin();
                            Entidades.Asignacionperiodocatedratico APCate = em.find(Entidades.Asignacionperiodocatedratico.class, APCat.get(0).getIdAsignacionPeriodoCatedratico());
                            APCate.setDisponible(false);
                            em.merge(APCate);
                            em.getTransaction().commit();
                            //Restar creditos
                            Entidades.Catedratico cated = ASC.get(0).getCatedraticoidCatedratico();
                            em.getTransaction().begin();
                            short creditos = cated.getCreditos();
                            creditos--;
                            cated.setCreditos(creditos);
                            em.merge(cated);
                            em.getTransaction().commit();
                        }
                        //Modificar disponibilidad aula
                        if (p.getAula()!=null){
                            int idA = p.getAula().getIdAula();
                            qr = em.createQuery("SELECT ha FROM Horarioaula ha "
                                    + "where ha.aulaidAula.idAula="+idA
                                    + " and ha.dia='"+D+"' and ha.anulado=false");
                            List<Entidades.Horarioaula> HorAu =qr.getResultList();
                            qr = em.createQuery("SELECT apa from Asignacionperiodoaula apa "
                                    + "where apa.horarioAulaidHorarioAula.idHorarioAula="+HorAu.get(0).getIdHorarioAula()
                                    + " and apa.periodoidPeriodo.idPeriodo="+horas.get(fila).getNumPeriodo());
                            List<Entidades.Asignacionperiodoaula> APAu =qr.getResultList();
                            em.getTransaction().begin();
                            Entidades.Asignacionperiodoaula APA = em.find(Entidades.Asignacionperiodoaula.class, APAu.get(0).getIdAsignacionPeriodoAula());
                            APA.setDisponible(false);
                            em.merge(APA);
                            em.getTransaction().commit();
                        }
                    }else{
                        int idHC=0;
                        for (int j=0; j<HorC.size(); j++){
                            qr = em.createQuery("select apc from Asignacionperiodocurso apc "
                                    + "where apc.periodoidPeriodo.idPeriodo="+horas.get(fila).getNumPeriodo()
                                    + " and apc.horarioCursoidHorarioCurso.idHorarioCurso="+HorC.get(j).getIdHorarioCurso());
                            List<Entidades.Asignacionperiodocurso> idHorC = qr.getResultList();
                            if (idHorC.size()>0){
                                idHC=j;
                            }
                        }
                        qr = em.createQuery("select apc from Asignacionperiodocurso apc "
                                + "where apc.horarioCursoidHorarioCurso.idHorarioCurso = "+HorC.get(idHC).getIdHorarioCurso()
                                + " and apc.periodoidPeriodo.idPeriodo="+horas.get(fila).getNumPeriodo());
                        List<Entidades.Asignacionperiodocurso> APCu =qr.getResultList();
                        if (APCu.size()<=0){
                            System.out.println("Lo guardo en el periodo:"+fila+" el dia:"+D);
                            //Ingresar nuevo HorarioAula
                            Controladores.HorariocursoJpaController tablaHorarioCurso = new Controladores.HorariocursoJpaController(emf);
                            Entidades.Horariocurso hc = new Entidades.Horariocurso();
                            hc.setAnulado(false);
                            qr = em.createQuery("select asc1 from Asignacionseccioncurso asc1 "
                                    + "where asc1.idAsignacionSeccionCurso="+idSec);
                            List<Entidades.Asignacionseccioncurso> ASC =qr.getResultList();
                            hc.setAsignacionSeccionCursoidAsignacionSeccionCurso(ASC.get(0));
                            qr = em.createQuery("select a from Aula a "
                                    + "where a.idAula="+p.getAula().getIdAula());
                            List<Entidades.Aula> Aula =qr.getResultList();
                            hc.setAulaidAula(Aula.get(0));
                            hc.setDia(D);
                            //Semestre
                            qr = em.createQuery("Select s from Semestre s "
                                    + "where s.año='"+anio+"-01-01"
                                    + "' and s.semestre="+semestre
                                    + " and s.anulado=false");
                            List<Entidades.Semestre> Semestre =qr.getResultList();
                            hc.setSemestreidSemestre(Semestre.get(0));
                            tablaHorarioCurso.create(hc);
                            //Ingresar nueva AsignacionPeriodoCurso
                            Controladores.AsignacionperiodocursoJpaController tablaAPC = new Controladores.AsignacionperiodocursoJpaController(emf);
                            Entidades.Asignacionperiodocurso APC = new Entidades.Asignacionperiodocurso();
                            APC.setHorarioCursoidHorarioCurso(hc);
                            qr = em.createQuery("SELECT p from Periodo p "
                                    + "where p.idPeriodo = "+horas.get(fila).getNumPeriodo());
                            List<Entidades.Periodo> Periodo =qr.getResultList();
                            APC.setPeriodoidPeriodo(Periodo.get(0));
                            tablaAPC.create(APC);
                            //Ya se habra ingresado la propuesta correcta y verificada
                            //Asignar catedratico a seccion y modificar disponibilidad
                            if (p.getCatedratico()!=null){
                                em.getTransaction().begin();
                                int idC = p.getCatedratico().getIdCatedratico();
                                qr = em.createQuery("SELECT c from Catedratico c "
                                        + "where c.numeroCatedratico = "+idC+" and c.anulado = false");
                                List<Entidades.Catedratico> Cated =qr.getResultList();
                                Entidades.Asignacionseccioncurso secc = em.find(Entidades.Asignacionseccioncurso.class, ASC.get(0).getIdAsignacionSeccionCurso());
                                secc.setCatedraticoidCatedratico(Cated.get(0));
                                em.merge(secc);
                                em.getTransaction().commit();
                                //Modificar disponibilidad catedratico
                                qr = em.createQuery("SELECT hc FROM Horariocatedratico hc "
                                        + "where hc.catedraticoidCatedratico.numeroCatedratico="+idC
                                        + " and hc.dia='"+D+"' and hc.anulado=false");
                                List<Entidades.Horariocatedratico> HorCat =qr.getResultList();
                                qr = em.createQuery("SELECT apc from Asignacionperiodocatedratico apc "
                                        + "where apc.horarioCatedraticoidHorarioCatedratico.idHorarioCatedratico="+HorCat.get(0).getIdHorarioCatedratico()
                                        + " and apc.periodoidPeriodo.idPeriodo="+horas.get(fila).getNumPeriodo());
                                List<Entidades.Asignacionperiodocatedratico> APCat =qr.getResultList();
                                em.getTransaction().begin();
                                Entidades.Asignacionperiodocatedratico APCate = em.find(Entidades.Asignacionperiodocatedratico.class, APCat.get(0).getIdAsignacionPeriodoCatedratico());
                                APCate.setDisponible(false);
                                em.merge(APCate);
                                em.getTransaction().commit();
                                //Restar creditos
                                Entidades.Catedratico cated = ASC.get(0).getCatedraticoidCatedratico();
                                em.getTransaction().begin();
                                short creditos = cated.getCreditos();
                                creditos--;
                                cated.setCreditos(creditos);
                                em.merge(cated);
                                em.getTransaction().commit();
                            }
                            //Modificar disponibilidad aula
                            if (p.getAula()!=null){
                                int idA = p.getAula().getIdAula();
                                qr = em.createQuery("SELECT ha FROM Horarioaula ha "
                                        + "where ha.aulaidAula.idAula="+idA
                                        + " and ha.dia='"+D+"' and ha.anulado=false");
                                List<Entidades.Horarioaula> HorAu =qr.getResultList();
                                qr = em.createQuery("SELECT apa from Asignacionperiodoaula apa "
                                        + "where apa.horarioAulaidHorarioAula.idHorarioAula="+HorAu.get(0).getIdHorarioAula()
                                        + " and apa.periodoidPeriodo.idPeriodo="+horas.get(fila).getNumPeriodo());
                                List<Entidades.Asignacionperiodoaula> APAu =qr.getResultList();
                                em.getTransaction().begin();
                                Entidades.Asignacionperiodoaula APA = em.find(Entidades.Asignacionperiodoaula.class, APAu.get(0).getIdAsignacionPeriodoAula());
                                APA.setDisponible(false);
                                em.merge(APA);
                                em.getTransaction().commit();
                            }
                        }
                    }
                }
            }
        }
    }
    
    public void llenarCalendario(){
        //En este metodo se llena la tabla
        ObservableList<NCalendario> data = FXCollections.observableArrayList();
        for (int fila=0; fila<horas.size(); fila++){
            data.add(new NCalendario(calendario, fila));
        }
        
        TableColumn periodoCol = new TableColumn("Periodo");
        periodoCol.setMinWidth(80);
        periodoCol.setCellValueFactory(
                new PropertyValueFactory<NCalendario, String>("periodo"));
        
        TableColumn lunesCol = new TableColumn("Lunes");
        lunesCol.setMinWidth(100);
        lunesCol.setCellValueFactory(
                new PropertyValueFactory<NCalendario, String>("lunes"));
        
        TableColumn martesCol = new TableColumn("Martes");
        martesCol.setMinWidth(100);
        martesCol.setCellValueFactory(
                new PropertyValueFactory<NCalendario, String>("martes"));
        
        TableColumn miercolesCol = new TableColumn("Miércoles");
        miercolesCol.setMinWidth(100);
        miercolesCol.setCellValueFactory(
                new PropertyValueFactory<NCalendario, String>("miercoles"));
        
        TableColumn juevesCol = new TableColumn("Jueves");
        juevesCol.setMinWidth(100);
        juevesCol.setCellValueFactory(
                new PropertyValueFactory<NCalendario, String>("jueves"));
        
        TableColumn viernesCol = new TableColumn("Viernes");
        viernesCol.setMinWidth(100);
        viernesCol.setCellValueFactory(
                new PropertyValueFactory<NCalendario, String>("viernes"));
        
        TableColumn sabadoCol = new TableColumn("Sábado");
        sabadoCol.setMinWidth(100);
        sabadoCol.setCellValueFactory(
                new PropertyValueFactory<NCalendario, String>("sabado"));
        
        tblHorario.setItems(data);
        tblHorario.getColumns().addAll(periodoCol,lunesCol,martesCol,miercolesCol,
                juevesCol,viernesCol,sabadoCol);
    }
    
    //////////////////////////Acciones//////////////////////////////////////////
    
    @FXML
    private void turnoSiguiente(){
        if (btnSiguiente.getText().equals("Finalizar")){
            btnFinalizar.setVisible(true);
            lstAula.setDisable(true);
            lstCatedratico.setDisable(true);
            cmbEdificio.setDisable(true);
            btnSiguiente.setDisable(true);
            seccion.setAsignado();
        }else{
            cmbPeriodo.setDisable(false);
            cmbDia.setDisable(false);
            txtCredito.setText("1");
            if (CreditosT >= 1){
                lblCredito.setText("Crédito Teórico");
            }
            if (CreditosT == 0 && CreditosP >= 1){
                lblCredito.setText("Crédito Practico");
            }
            if (CreditosT == 0 && CreditosP == 0){
                txtCredito.setText("0");
            }
            btnAsignar.setDisable(false);
            btnSiguiente.setDisable(true);
            if (CreditosT == 0 && CreditosP == 0 ){
                btnAsignar.setDisable(true);
            }
            cmbPeriodo.setFocusTraversable(true);
        }
    }
    
    @FXML
    private void asignar(){
        boolean error=false;
        Propuesta propuesta = new Propuesta();
        propuesta.setCurso(curso.getNombre());
        propuesta.setSeccion(seccion);
        if (lstCatedratico.getSelectionModel().getSelectedIndex()>=0){
            propuesta.setCatedratico(Catedraticos.get(lstCatedratico.getSelectionModel().getSelectedIndex()));
            if (Catedraticos.get(lstCatedratico.getSelectionModel().getSelectedIndex()).getCreditos()
                    <curso.getCreditos()){
                error = true; //Los catedraticos no cuentan con los suficientes creditos
            }
        }else{
            propuesta.setCatedratico(null);
        }
        if (lstAula.getSelectionModel().getSelectedIndex()<0){
            error = true;
        }else{
            propuesta.setAula(Aulas.get(lstAula.getSelectionModel().getSelectedIndex()));
        }
        
        if (error==false){
            int fila=cmbPeriodo.getSelectionModel().getSelectedIndex();
            int columna= cmbDia.getSelectionModel().getSelectedIndex();
            if (asignarPropuestaPeriodo(propuesta, calendario.getEnlace(fila).getPeriodo(columna),
                    cmbDia.getSelectionModel().getSelectedIndex(),
                    cmbPeriodo.getSelectionModel().getSelectedIndex(),
                    cmbDia.getValue().toString())==true){
                //llenarCalendario();
                if (lblCredito.getText().equals("Crédito Teórico")){
                    CreditosT--;
                }
                if (lblCredito.getText().equals("Crédito Practico")){
                    CreditosP--;
                }
                lblCreditosT.setText(CreditosT+" creditos teoricos");
                lblCreditosP.setText(CreditosP+" creditos practicos");
                txtCredito.setText("");
                btnAsignar.setDisable(true);
                cmbPeriodo.setDisable(true);
                cmbDia.setDisable(true);
                if (CreditosT == 0 && CreditosP == 0 ){
                    btnSiguiente.setText("Finalizar");
                    seccion.setAsignado();
                }
                btnSiguiente.setDisable(false);
                llenarCalendario();
            }else{
                System.out.println("Fallo");
            }
        }else{
            System.out.println("Fallo");
        }
    }
    
    @FXML
    private void Guardar(){
        guardarCalendario();
        JOptionPane.showMessageDialog(null, "Calendario Guardado!");
        btnFinalizar.setDisable(true);
    }
    
    @FXML
    private void itemChange(){
        lstAula.setItems(datos.obtenerAulas(cmbEdificio.getValue().toString(), seccion));
        datos.filtrarAulas(Aulas, cmbEdificio.getValue().toString(), seccion);
    }

    /**
     * Initializes the controller class.
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
    }
    
}
